package test

import (
	"context"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
	"log"
	"os"
	"os/exec"
)

var Ai = aiApi{
	apiKey: g.Config().MustGet(context.Background(), "app.wxtech.apiKey").String(),
}

type aiApi struct {
	apiKey string
}

func (aiApi) Stream(r *ghttp.Request) {
	ctx := r.Context()
	ch := make(chan struct{})

	rPipe, wPipe, err := os.Pipe()
	if err != nil {
		panic(err)
	}

	cmd := exec.CommandContext(ctx, "python", "-c", "exec(\"import sys\\nimport time\\nfor i in range(40): print(i);sys.stdout.flush();time.sleep(0.1)\")")
	cmd.Stdout = wPipe
	cmd.Stderr = wPipe
	if err := cmd.Start(); err != nil {
		panic(err)
	}

	go writeOutput(r, rPipe)

	go func(ch chan struct{}) {
		err := cmd.Wait()
		if err != nil {
			panic(err)
		}

		err = wPipe.Close()
		if err != nil {
			panic(err)
		}

		ch <- struct{}{}
	}(ch)

	select {
	case <-ch:
	case <-ctx.Done():
		err := ctx.Err()
		log.Printf("Client disconnected: %s\n", err)
	}
}

// func writeOutput(r *ghttp.Request, input io.ReadCloser) {
// 	easyResponse.New(r).SetSseHeader()
//
// 	writer := r.Response.Writer.RawWriter()
// 	flusher, ok := writer.(http.Flusher)
// 	if !ok {
// 		panic("")
// 	}
//
// 	in := bufio.NewScanner(input)
// 	for in.Scan() {
// 		data := in.Text()
// 		fmt.Println(data)
//
// 		_, err := fmt.Fprintf(writer, "data: %s\n", data)
// 		if err != nil {
// 			panic(err)
// 		}
//
// 		flusher.Flush()
// 	}
//
// 	err := input.Close()
// 	if err != nil {
// 		panic(err)
// 	}
// }
//
// func (aiApi) GetConversationResult(r *ghttp.Request) {
// 	var req *model.ChatGptTaskGetItem
// 	service.Parse(r, &req)
//
// 	res := easyResponse.New(r).SetSseHeader()
// 	ctx := r.Context()
//
// 	length, err := easyRedis.Ctx(ctx).LLen(req.TaskId)
// 	if err != nil || length.Int() <= 0 {
// 		res.WriteEventMessage(&easyResponse.EventMessage{
// 			Eof: true,
// 		})
// 		return
// 	}
//
// 	var num int
// 	for {
// 		data, err := easyRedis.Ctx(ctx).RPop(req.TaskId)
// 		dataString := data.String()
// 		if err != nil || dataString == model.GitMindEventStreamEnd || num > 80 {
// 			res.WriteEventMessage(&easyResponse.EventMessage{
// 				Eof: true,
// 			})
// 			break
// 		}
//
// 		if dataString == "" {
// 			num++
// 		}
//
// 		if dataString != "" && dataString != model.GitMindEventStreamStart {
// 			res.WriteEventMessage(&easyResponse.EventMessage{
// 				Data: dataString,
// 			})
// 		}
//
// 		time.Sleep(model.DurationLoop)
// 	}
// }
